package ec.linde.persistencia.entidades.proyectos;

import static javax.persistence.GenerationType.IDENTITY;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * TODO: Agregar descripcion
 * 
 * @FechaCreacion: 29/09/2014
 * @author: Alex Carrillo
 * @FechaModificacion: 29/09/2014
 * @author: Alex Carrillo
 * @version: 1.0
 */
@Entity
@Table(name = "prod_rdo", schema = "productividad")
public class Rdo extends EntidadBase {

	private static final long serialVersionUID = 3935545106378163867L;

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "rdo_id", unique = true, nullable = false)
	private int idRdo;

	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "plop_id", nullable = false)
	@NotNull
	private PlanOperativo planOperativo;

	@Temporal(TemporalType.DATE)
	@Column(name = "rdo_fecha", nullable = true)
	private Date fecha;

	@Column(name = "rdo_descripcion", nullable = true)
	@Size(max = 200)
	private String descripcion;

	@Column(name = "rdo_numero_accidentes", nullable = false)
	@NotNull
	@Min(0)
	private int numeroAccidentes;

	@Column(name = "rdo_descripcion_accidente", nullable = true)
	@Size(max = 200)
	private String descripcionAccidente;

	@Column(name = "rdo_numero_incidentes", nullable = false)
	@NotNull
	@Min(0)
	private int numeroIncidentes;

	@Column(name = "rdo_descrip_incidente", nullable = true)
	@Size(max = 200)
	private String descripcionIncidente;

	@Column(name = "rdo_dias_perdidos", nullable = false)
	@NotNull
	@Min(0)
	private int diasPerdidos;

	@Column(name = "rdo_descrip_dias_perdidos", nullable = true)
	@Size(max = 200)
	private String descripcionDiasPerdidos;

	@Column(name = "rdo_horas_perdidas", nullable = false)
	@NotNull
	@Min(0)
	private int horasPerdidas;

	@Column(name = "rdo_descrip_horas_perdidas", nullable = false)
	@Size(max = 200)
	private String descripcionHorasPerdidas;

	@Transient
	private boolean indicadorCosto;

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "rdo")
	private List<DetalleRdo> listaDetalleRdo = new ArrayList<DetalleRdo>();

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.entities.EntidadBase#getId()
	 */
	@Override
	public int getId() {
		return this.idRdo;
	}

	public int getIdRdo() {
		return idRdo;
	}

	public void setIdRdo(int idRdo) {
		this.idRdo = idRdo;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public PlanOperativo getPlanOperativo() {
		return planOperativo;
	}

	public void setPlanOperativo(PlanOperativo planOperativo) {
		this.planOperativo = planOperativo;
	}

	public int getNumeroAccidentes() {
		return numeroAccidentes;
	}

	public void setNumeroAccidentes(int numeroAccidentes) {
		this.numeroAccidentes = numeroAccidentes;
	}

	public String getDescripcionAccidente() {
		return descripcionAccidente;
	}

	public void setDescripcionAccidente(String descripcionAccidente) {
		this.descripcionAccidente = descripcionAccidente;
	}

	public int getNumeroIncidentes() {
		return numeroIncidentes;
	}

	public void setNumeroIncidentes(int numeroIncidentes) {
		this.numeroIncidentes = numeroIncidentes;
	}

	public String getDescripcionIncidente() {
		return descripcionIncidente;
	}

	public void setDescripcionIncidente(String descripcionIncidente) {
		this.descripcionIncidente = descripcionIncidente;
	}

	public int getDiasPerdidos() {
		return diasPerdidos;
	}

	public void setDiasPerdidos(int diasPerdidos) {
		this.diasPerdidos = diasPerdidos;
	}

	public String getDescripcionDiasPerdidos() {
		return descripcionDiasPerdidos;
	}

	public void setDescripcionDiasPerdidos(String descripcionDiasPerdidos) {
		this.descripcionDiasPerdidos = descripcionDiasPerdidos;
	}

	public int getHorasPerdidas() {
		return horasPerdidas;
	}

	public void setHorasPerdidas(int horasPerdidas) {
		this.horasPerdidas = horasPerdidas;
	}

	public String getDescripcionHorasPerdidas() {
		return descripcionHorasPerdidas;
	}

	public void setDescripcionHorasPerdidas(String descripcionHorasPerdidas) {
		this.descripcionHorasPerdidas = descripcionHorasPerdidas;
	}

	public boolean isIndicadorCosto() {
		return indicadorCosto;
	}

	public void setIndicadorCosto(boolean indicadorCosto) {
		this.indicadorCosto = indicadorCosto;
	}

	public List<DetalleRdo> getListaDetalleRdo() {
		return listaDetalleRdo;
	}

	public void setListaDetalleRdo(List<DetalleRdo> listaDetalleRdo) {
		this.listaDetalleRdo = listaDetalleRdo;
	}

	public BigDecimal getTotalCostoTarea() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetalleRdo detalleRdo : listaDetalleRdo) {
			if (!detalleRdo.isEliminado()) {
				total = total.add(detalleRdo.getCostoTarea());
			}
		}
		return total;
	}

	public BigDecimal getTotalPesoTarea() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetalleRdo detalleRdo : listaDetalleRdo) {
			if (!detalleRdo.isEliminado()) {
				total = total.add(detalleRdo.getPeso());
			}
		}
		return total;
	}

	public BigDecimal getTotalCostoReal() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetalleRdo detalleRdo : listaDetalleRdo) {
			if (!detalleRdo.isEliminado()) {
				total = total.add(detalleRdo.getCostoReal());
			}
		}
		return total;
	}

	public BigDecimal getTotalCostoFinal() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetalleRdo detalleRdo : listaDetalleRdo) {
			if (!detalleRdo.isEliminado()) {
				total = total.add(detalleRdo.getCostoFinal());
			}
		}
		return total;
	}

}
